package com.zxw.utils;

import com.alibaba.csp.sentinel.util.TimeUtil;

import java.util.concurrent.atomic.AtomicLong;

/**
 * 漏桶限流算法
 * 一个固定容量的漏桶，按照常量固定速率流出水滴；
 * 如果桶是空的，则不需流出水滴；
 * 可以以任意速率流入水滴到漏桶；
 * 如果流入水滴超出了桶的容量，则流入的水滴溢出了（被丢弃），而漏桶容量是不变的。
 *
 * @author zxw
 * @date 2021-01-11 16:31
 */
public class LeakyBucketRate implements RateLimiter {
    // 当前数量
    private int size = 0;
    // 最大容量
    private int bucketSize;
    // 速率
    private int rate;
    // 水量
    private volatile double water;
    private AtomicLong time = new AtomicLong(-1);

    public LeakyBucketRate(int bucketSize, int qps) {
        this.bucketSize = bucketSize;
        this.rate = qps;
        this.water = 0;
        this.time.set(System.currentTimeMillis());
    }

    @Override
    public boolean pass() {
        long currentTime = TimeUtil.currentTimeMillis();
        int out = (int) (currentTime - time.get() * bucketSize / 1000.0);
        return false;
    }
}
